/**
 * 项目反馈业务逻辑模块
 * 从主包移至分包，优化主包体积
 */

// 导入必要的模块
const ccminiCloudfuncUtil = require('../cmpts/public/helper/ccmini_cloudfunc_util.js');
const ccminiTimeUtil = require('../cmpts/public/helper/ccmini_time_util.js');
const ccminiValidateUtil = require('../cmpts/public/helper/ccmini_validate_util.js');
const ProjectBiz = require('./project_biz.js');

/**
 * 项目反馈业务类
 */
class ProjectFeedbackBiz {

  /**
   * 获取反馈列表
   * @param {*} param0 查询参数 
   * @returns 反馈列表
   */
  static async getList({ projectId, search, sortType, sortVal, orderBy, whereEx, page, size, isTotal = true, oldTotal }) {
    if (!ProjectBiz.isValid(projectId)) return null;

    let orderByStr = '';
    if (orderBy) {
      orderByStr = orderBy;
    } else if (sortType && ccminiValidateUtil.checkSort(sortType)) {
      orderByStr = sortType;
      if (sortVal !== '' && sortVal !== undefined && sortVal != null) {
        orderByStr += ':' + sortVal;
      }
    } else {
      orderByStr = 'FEEDBACK_ADD_TIME|desc';
    }

    const query = {
      dbName: 'feedback',
      where: {
        PROJECT_ID: projectId,
        FEEDBACK_STATUS: ['in', [0, 1]]
      },
      orderBy: orderByStr,
      page,
      size,
      isTotal,
      oldTotal
    };

    // 附加查询条件
    if (whereEx) {
      query.where = Object.assign(query.where, whereEx);
    }

    // 关键字查询
    if (search) {
      query.where.FEEDBACK_TITLE = {
        $regex: '.*' + search,
        $options: 'i'
      };
    }

    return await ccminiCloudfuncUtil.callCloudData(query);
  }

  /**
   * 提交反馈
   * @param {*} params 反馈参数
   * @returns 反馈结果
   */
  static async submitFeedback(params) {
    const { projectId, title, content, images = [] } = params;

    if (!ProjectBiz.isValid(projectId)) {
      return { success: false, message: '项目ID无效' };
    }

    if (!title || title.length < 5 || title.length > 50) {
      return { success: false, message: '反馈标题必须在5-50字之间' };
    }

    if (!content || content.length < 10 || content.length > 500) {
      return { success: false, message: '反馈内容必须在10-500字之间' };
    }

    if (images.length > 6) {
      return { success: false, message: '最多上传6张图片' };
    }

    const data = {
      PROJECT_ID: projectId,
      FEEDBACK_TITLE: title,
      FEEDBACK_CONTENT: content,
      FEEDBACK_IMAGES: images,
      FEEDBACK_STATUS: 0, // 0表示待处理
      FEEDBACK_ADD_TIME: ccminiTimeUtil.time()
    };

    const result = await ccminiCloudfuncUtil.callCloudSumbit('feedback', 'insert', data);
    return { success: result.code === 0, message: result.code === 0 ? '反馈提交成功' : '反馈提交失败' };
  }

  /**
   * 获取反馈详情
   * @param {*} feedbackId 反馈ID
   * @returns 反馈详情
   */
  static async getDetail(feedbackId) {
    const query = {
      dbName: 'feedback',
      where: {
        _id: feedbackId
      }
    };

    const result = await ccminiCloudfuncUtil.callCloudData(query);
    if (result && result.data && result.data.length > 0) {
      return result.data[0];
    }
    return null;
  }

    /**
     * 获取反馈类型图标
     * @param {number} type 反馈类型
     * @returns {string} 图标名称
     */
    static getTypeIcon(type) {
        switch (parseInt(type)) {
            case 1: return 'bug'; // 功能问题
            case 2: return 'loading'; // 性能问题
            case 3: return 'like-o'; // 质量问题
            case 4: return 'bulb-o'; // 建议
            case 5: return 'notes-o'; // 其他
            default: return 'comment-o';
        }
    }

    /**
     * 获取反馈类型颜色
     * @param {number} type 反馈类型
     * @returns {string} 颜色
     */
    static getTypeColor(type) {
        switch (parseInt(type)) {
            case 1: return '#e54d42'; // 功能问题
            case 2: return '#f37b1d'; // 性能问题
            case 3: return '#fbbd08'; // 质量问题
            case 4: return '#39b54a'; // 建议
            case 5: return '#8799a3'; // 其他
            default: return '#0081ff';
        }
    }

    /**
     * 获取优先级图标
     * @param {number} priority 优先级
     * @returns {string} 图标名称
     */
    static getPriorityIcon(priority) {
        switch (parseInt(priority)) {
            case 1: return 'like-o'; // 低
            case 2: return 'arrow-up'; // 中
            case 3: return 'hot-o'; // 高
            case 4: return 'warning-o'; // 紧急
            default: return 'arrow-up';
        }
    }

    /**
     * 获取优先级颜色
     * @param {number} priority 优先级
     * @returns {string} 颜色
     */
    static getPriorityColor(priority) {
        switch (parseInt(priority)) {
            case 1: return '#8799a3'; // 低
            case 2: return '#0081ff'; // 中
            case 3: return '#f37b1d'; // 高
            case 4: return '#e54d42'; // 紧急
            default: return '#0081ff';
        }
    }

    /**
     * 获取状态图标
     * @param {number} status 状态
     * @returns {string} 图标名称
     */
    static getStatusIcon(status) {
        switch (parseInt(status)) {
            case 1: return 'new-o'; // 待处理
            case 2: return 'loading'; // 处理中
            case 3: return 'check-o'; // 已解决
            case 4: return 'close'; // 已拒绝
            case 5: return 'info-o'; // 已关闭
            default: return 'new-o';
        }
    }

    /**
     * 获取状态颜色
     * @param {number} status 状态
     * @returns {string} 颜色
     */
    static getStatusColor(status) {
        switch (parseInt(status)) {
            case 1: return '#0081ff'; // 待处理
            case 2: return '#fbbd08'; // 处理中
            case 3: return '#39b54a'; // 已解决
            case 4: return '#e54d42'; // 已拒绝
            case 5: return '#8799a3'; // 已关闭
            default: return '#0081ff';
        }
    }
    
    /**
     * 获取状态名称
     * @param {number} status 状态
     * @returns {string} 状态名称
     */
    static getStatusName(status) {
        switch (parseInt(status)) {
            case 1: return '待处理';
            case 2: return '处理中';
            case 3: return '已解决';
            case 4: return '已拒绝';
            case 5: return '已关闭';
            default: return '未知状态';
        }
    }
    
    /**
     * 获取类型名称
     * @param {number} type 类型
     * @returns {string} 类型名称
     */
    static getTypeName(type) {
        switch (parseInt(type)) {
            case 1: return '功能问题';
            case 2: return '性能问题';
            case 3: return '质量问题';
            case 4: return '建议';
            case 5: return '其他';
            default: return '未知类型';
        }
    }
    
    /**
     * 获取优先级名称
     * @param {number} priority 优先级
     * @returns {string} 优先级名称
     */
    static getPriorityName(priority) {
        switch (parseInt(priority)) {
            case 1: return '低';
            case 2: return '中';
            case 3: return '高';
            case 4: return '紧急';
            default: return '未知优先级';
        }
    }
    
    /**
     * 获取图片云存储路径
     * @param {string} imgPath 图片路径
     * @param {string} projectId 项目ID
     * @returns {string} 云路径
     */
    static getImageCloudPath(imgPath, projectId) {
        let timestamp = ccminiTimeUtil.time();
        let randNum = ccminiValidateUtil.genRandomNum(100, 999);
        let ext = imgPath.match(/\.[^.]+?$/)[0];
        return ProjectBiz.PROJECT_OA_NAME + '/feedback/' + projectId + '/' + timestamp + '_' + randNum + ext;
    }
    
    /**
     * 获取文件云存储路径
     * @param {string} fileName 文件名
     * @param {string} projectId 项目ID
     * @returns {string} 云路径
     */
    static getFileCloudPath(fileName, projectId) {
        let timestamp = ccminiTimeUtil.time();
        let randNum = ccminiValidateUtil.genRandomNum(100, 999);
        let ext = fileName.match(/\.[^.]+?$/)[0];
        return ProjectBiz.PROJECT_OA_NAME + '/feedback_file/' + projectId + '/' + timestamp + '_' + randNum + ext;
    }
}

module.exports = ProjectFeedbackBiz; 